
*************************************************************************************
	;Header frs File-linken

	IFD	Flag_project
Flag_engine	set 1
	ENDC
	IFND	Flag_engine
Flag_engine	set 0
	ENDC
	IFEQ	Flag_engine
Flag_engine	set 1
	include	Nutz_project
	ELSEIF
**************************************************************************************


;-------------- Object System ------------------------

*--------------------------------------------------------------------------
*-------	BOBS
*--------------------------------------------------------------------------
BOB_BLITZ		EQU	1
BOB_FAST		EQU	0
BOB_NORMAL		EQU	-1

BOB_FLIP		EQU	1
BOB_FALSE		EQU	-1
BOB_TRUE		EQU	1

BOB_BLOCK		EQU	2
BOB_BLOCK_NO_CLEAR	EQU	1
BOB_BLOCK_CLEAR		EQU	0

NO_BOBROUT	=	0
NO_BOBBLIT	=	1
BOB_URGENT	=	2
NO_ROUT_VAL	=	1
NO_BLIT_VAL	=	2
URGENT_VAL	=	4
**************************************************************************************
*--------------------------------------------------------------------------
*--------------------------------------------------------------------------
Bob_System:
		;Initialize Pointer to Structures
		lea	Bob_Structure(a6),a4

		;Bob Used ???

.Loop		tst.b	Bob_Used(a4)
		bmi	.Unused

		move.l	Bob_Routine(a4),a0
		move.l	a4,-(sp)
		jsr	(a0)
		move.l	(sp)+,a4
.Unused:
		lea	BOB_ENTRY_LENGTH(a4),a4
		cmp.l	#Bob_Structure_End,a4
		blo	.Loop
*--------------------------------------------------------------------------
;		*-->Hintergrund Anims mssen zuletzt gemacht werden
		;Initialize Pointer to Structures
		lea	BackAnim_Structure(a6),a4

		;Bob Used ???

.BLoop		tst.b	Bob_Used(a4)
		bmi	.BUnused

		move.l	Bob_Routine(a4),a0
		move.l	a4,-(sp)
		jsr	(a0)
		move.l	(sp)+,a4
.BUnused:
		adda	#BOB_ENTRY_LENGTH,a4
		cmp.l	#BackAnim_Structure_End,a4
		blo	.BLoop

		rts


Bob_System_Init:
	lea	Bob_Structure(a6),a4
	move.w	#BOB_MAXIMUM-1,d7
.loop:
	move.b	#BOB_FALSE,Bob_Used(a4)
	lea	BOB_ENTRY_LENGTH(a4),a4
	dbf	d7,.loop


	lea	BackAnim_Structure(a6),a4
	move.w	#BACK_MAXIMUM-1,d7
.loop2:
	move.b	#BOB_FALSE,Bob_Used(a4)
	lea	BOB_ENTRY_LENGTH(a4),a4
	dbf	d7,.loop2


	lea	Bob_Info_Tab_Adrs(a6),a1
	moveq	#127,d7
.security:
	move.w	#Extra_I_Heart-Bob_Info_Start,(a1)+
	dbf	d7,.security

	lea	Bob_Info_Tab_Default(pc),a0
	lea	Bob_Info_Tab_Adrs(a6),a1
	moveq	#Bob_Info_Tab_Default_len/2-1,d7
.copy_default:
	move.w	(a0)+,(a1)+
	dbf	d7,.copy_default

	rts

; ==========================================================================
;
; Suche Eintrag in der Bob-Struktur
;
; d0 = Bob-Nummer			d0 = Positiv/Negativ
;					a4 = Zeiger auf Eintrag
;
; ==========================================================================

Suche_Bob_Eintrag:
		lea	Bob_Structure(a6),a4
.Loop		tst.b	Bob_Used(a4)
		bmi	.No_Entry
		tst	Bob_Back_Anim(a4)
		bne	.No_Entry
		btst.b	#NO_BOBROUT,Bob_BlitStatus(a4)
		bne	.No_Entry
		cmp	Bob_Number(a4),d0
		bne	.No_Entry
		moveq	#0,d0
		rts
.No_Entry:
		add	#BOB_ENTRY_LENGTH,a4
		cmp.l	#Bob_Structure_End,a4
		blo	.Loop
		moveq	#-1,d0
		rts

; ==========================================================================
;
; Freien Eintrag in der Bob-Struktur suchen, Abhngig von BackAnimFlag
;
; d0 = Bob-Nummer			d0 = Positiv/Negativ
;					a4 = Zeiger auf Eintrag
;
; ==========================================================================

Search_Bob_Entry:
	cmp.w	#127,d0
	bhi.s	.NO_ENTER2
		movem.l	d0/d7/a0-a2,-(sp)

		lea	Bob_Structure(a6),a4
		moveq	#BOB_LOOP_MAX-1,d7

	move.w	d0,-(sp)
		lea	Bob_Info_Tab_Adrs(a6),a0
		add	d0,d0
		move.w	(a0,d0),d0
		beq.s	.NO_ENTER
		lea	Bob_Info_Start,a2
		lea	(a2,d0.w),a2
		add.b	Bob_I_Priority(a2),d7
	move.w	(sp)+,d0

		btst	#BOB_I_BACKANIM,Bob_I_Flags(a2)
		beq.s	.use_list

		lea	BackAnim_Structure(a6),a4
		moveq	#BACK_LOOP_MAX-1,d7

		*--*>Search free Entry / auf PRIOS achten
.use_list:
		*--*>Make Loop Counter

.Loop		tst.b	Bob_Used(a4)
		bmi.s	.ENTER_BOB

		lea	BOB_ENTRY_LENGTH(a4),a4
		dbf	d7,.Loop

.NO_ENTER		*--*>NoEntry
		movem.l	(sp)+,d0/d7/a0-a2
.NO_ENTER2
		moveq	#-1,d0	;No_Entry_Found
		rts

.ENTER_BOB	*--*>Enter Bob
;		movem.l	(sp),d0/d7/a0-a2		;Registerinhalte wiederherstellen.


; ==========================================================================
;
; Eintrag in der Bob-Struktur erzeugen
;
; d0 = Bob-Nummer			d0 = Positiv/Negativ
; a4 = Zeiger auf Eintrag
;
; ==========================================================================

Do_Enter_Bob:
		*--Enter Bob
		move.l	a1,Bob_Entry_Adress(a4)

		*--Write Bobnumber

		move	d0,Bob_Number(a4)
		*--Determine Info Tab Adress
		lea	Bob_Info_Tab_Adrs(a6),a0
		add	d0,d0
		move.w	(a0,d0),d0
;		beq	.NoEnter
		lea	Bob_Info_Start,a2
		lea	(a2,d0.w),a2

		;Write Non Change Values
		move	Bob_I_Width(a2),Bob_Width(a4)
		;Write Values
		move	Bob_I_Height(a2),Bob_Height(a4)
		move.l	Bob_I_Routine(a2),Bob_Routine(a4)
		move.l	Bob_I_Next_Anim(a2),Bob_Next_Anim(a4)
		move	Bob_I_Anim_Delay(a2),Bob_Anim_Delay(a4)
		move	Bob_I_Anim_Del_Init(a2),Bob_Anim_Delay_Init(a4)

		move.w	#160,Bob_Out_X_Val(a4)
		move.w	#160+32,Bob_Out_Y_Val(a4)

		clr.l	Bob_Plane_Order(a4)

		;Write Values which are not in Info Table
		move.b	#BOB_TRUE,Bob_Used(a4)
		clr.b	Bob_BlitStatus(a4)
		move	d1,Bob_X_Position(a4)
		add	#16,Bob_X_Position(a4)	****!!!! FAKE
		move	d2,Bob_Y_Position(a4)
		clr.w	Bob_X_Out(a4)
		clr.w	Bob_Y_Out(a4)
		clr.w	Bob_Special_1(a4)
		clr.w	Bob_Special_2(a4)
		clr.w	Bob_Special_3(a4)
		clr.w	Bob_Special_4(a4)
		clr.w	Bob_Hit(a4)
		clr.w	Bob_Back_Anim(a4)
		clr.l	Bob_Koords_Save1(a4)
		clr.l	Bob_Koords_Save2(a4)

		jsr	Get_Next_Bob_Frame

		movem.l	(sp)+,d0/d7/a0-a2
		moveq	#1,d0
		rts

.NoEnter	movem.l	(sp)+,d0/d7/a0-a2
		moveq	#-1,d0
		rts

ENTER_BOB:
		cmp	#127,d0
		bhs	.NoEnter
		movem.l	d0/d7/a0-a2,-(sp)
		bra	Do_Enter_Bob
.NoEnter:
		moveq	#-1,d0
		rts

**************************************************************************************
************	BOB Info Table
**************************************************************************************
*-------------------------------------------------------------------------------------
NullAnim:	dc.w	0		;FlipStatus
		dc.l	0		;SigelInfo
		dc.w	0,0		;X-,Y-Offset
*-------------------------------------------------------------------------------------
*-------------------------------------------------------------------------------------
Bob_Info_Tab_Default:
		*--*>Global Bobs !!!
		dc.w	Extra_I_Heart-Bob_Info_Start
		dc.w	Extra_Hitpoint_NF-Bob_Info_Start
		dc.w	Extra_Hitpoint-Bob_Info_Start
		dc.w	Extra_I_Gem1-Bob_Info_Start
		dc.w	Extra_I_Gem2-Bob_Info_Start
		dc.w	Extra_I_Gem1-Bob_Info_Start
		dc.w	Extra_I_Gem1-Bob_Info_Start
		dc.w	Extra_I_OneUp-Bob_Info_Start
		dc.w	Extra_I_Heart-Bob_Info_Start
		dc.w	Extra_I_ShieldT-Bob_Info_Start
		dc.w	Extra_I_Shield-Bob_Info_Start
		dc.w	Extra_I_Bomb-Bob_Info_Start

		dc.w	Extra_I_Smoke_X-Bob_Info_Start
		dc.w	Extra_I_Smoke_Y-Bob_Info_Start
		dc.w	Extra_I_Aufl-Bob_Info_Start
*-------------------------------------------------------------------------------------
Bob_Info_Tab_Default_len	= *-Bob_Info_Tab_Default
HITPOINT_NF	=1
HITPOINT	=2
GEMC1		=3
GEMC2		=4
GEMC3		=5
GEMC4		=6
ONEUP		=7
HEART		=8
SHIELDR		=9
SHIELDG		=10
SBOMBE		=11
COLLECTBORDER_END	=11
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SMOKE_X		=COLLECTBORDER_END+1
SMOKE_Y		=COLLECTBORDER_END+2
GEMS_AUFL		=COLLECTBORDER_END+3
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
G_BOX_DAMAGE=40
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
S_EXTRALAMP	=100
S_EXTRAK_01	=101
S_EXTRAK_02	=102
S_EXTRAK_03	=103
S_EXTRAK_04	=104
S_EXTRAK_05	=105
S_EXTRAK_06	=106
S_EXTRAK_07	=107
S_EXTRAK_08	=108
S_EXTRAK_09	=109
S_EXTRAK_10	=110
S_EXTRAK_11	=111
S_EXTRAK_12	=112
S_EXTRAK_13	=113
S_EXTRAK_14	=114
S_EXTRAK_15	=115
S_EXTRAK_16	=116
S_EXTRAK_17	=117
S_EXTRAK_18	=118
S_EXTRAK_19	=119
S_KEYPOINT	=120
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

**************************************************************************************
*-------------------------------------------------------------------------------------
*---------	GET SOME ADRS
*-------------------------------------------------------------------------------------
*---------	IN
*---------	d0	Number of Adrs
*-------------------------------------------------------------------------------------
*---------	OUT
*---------	d0	0=0k/+=NotEnoughGet
*-------------------------------------------------------------------------------------
Get_Entry_Adrs_HI	*--*>Try to Get enough Entry Adrs
		movem.l	d7/a0/a1,-(sp)
		moveq	#BOB_MAXIMUM-1,d7
		lea	Bob_Structure(a6),a1

		lea	ENTRY_ADRS(a6),a0
		*--*> GETLOOP
.Get_Loop	tst.b	Bob_Used(a1)
		bmi.s	.Get_One
.In_Loop	add	#BOB_ENTRY_LENGTH,a1
		dbf	d7,.Get_Loop
		movem.l	(sp)+,d7/a0/a1
		rts
.Get_One		*--Get One Adr
		move.l	a1,(a0)+
		subq	#1,d0
		bne.s	.In_Loop
		movem.l	(sp)+,d7/a0/a1
		rts
*-------------------------------------------------------------------------------------
Get_Entry_Adrs_MID	*--*>Try to Get enough Entry Adrs
		movem.l	d7/a0/a1,-(sp)
		lea	ENTRY_ADRS(a6),a0
		*--*> GETLOOP
		moveq	#BOB_LOOP_MAX-1,d7
		lea	Bob_Structure(a6),a1
.Get_Loop		tst.b	Bob_Used(a1)
		bmi.s	.Get_One
.In_Loop		add	#BOB_ENTRY_LENGTH,a1
		dbf	d7,.Get_Loop
		movem.l	(sp)+,d7/a0/a1
		rts
.Get_One		*--Get One Adr
		move.l	a1,(a0)+
		subq	#1,d0
		bne.s	.In_Loop
		movem.l	(sp)+,d7/a0/a1
		rts
*-------------------------------------------------------------------------------------
Get_Entry_Adrs_LOW	*--*>Try to Get enough Entry Adrs
		movem.l	d7/a0/a1,-(sp)
		lea	ENTRY_ADRS(a6),a0
		*--*> GETLOOP
		lea	Bob_Structure(a6),a1
		moveq	#BOB_LOOP_MAX-1,d7
		add	#BOB_LOW_PRIO,d7
.Get_Loop		tst.b	Bob_Used(a1)
		bmi.s	.Get_One
.In_Loop		add	#BOB_ENTRY_LENGTH,a1
		dbf	d7,.Get_Loop
		movem.l	(sp)+,d7/a0/a1
		rts
.Get_One		*--Get One Adr
		move.l	a1,(a0)+
		subq	#1,d0
		bne.s	.In_Loop
		movem.l	(sp)+,d7/a0/a1
		rts

Get_Entry_Adrs_Back	*--*>Try to Get enough Entry Adrs
		movem.l	d7/a0/a1,-(sp)
		moveq	#BACK_MAXIMUM-1,d7
		lea	BackAnim_Structure(a6),a1

		lea	ENTRY_ADRS(a6),a0
		*--*> GETLOOP
.Get_Loop	tst.b	Bob_Used(a1)
		bmi.s	.Get_One
.In_Loop	lea	BOB_ENTRY_LENGTH(a1),a1
		dbf	d7,.Get_Loop
		movem.l	(sp)+,d7/a0/a1
		rts
.Get_One		*--Get One Adr
		move.l	a1,(a0)+
		subq	#1,d0
		bne.s	.In_Loop
		movem.l	(sp)+,d7/a0/a1
		rts

**************************************************************************************
*-------------------------------------------------------------------------------------
Test_Bob_Out:
	move.w	Bob_X_Position(a4),d0
	sub.w	Scr_X_Level_Pos(a6),d0
	move.w	d0,d1
	add.w	Bob_Width(a4),d1
	neg.w	d1
	sub.w	#320,d0
	cmp.w	Bob_Out_X_Val(a4),d1
	bgt.s	Out_Bob
	cmp.w	Bob_Out_X_Val(a4),d0
	bgt.s	Out_Bob

	move.w	Bob_Y_Position(a4),d0
	move	d0,d1
	sub	Scr_Y_Max(a6),d1
	sub	#200-16,d1		;ScreenSize !
	bpl.s	Out_Bob

	sub.w	Scr_Y_Level_Pos(a6),d0
	move.w	d0,d1
	add.w	Bob_Height(a4),d1
	neg.w	d1
	sub.w	#224,d0

	cmp.w	Bob_Out_Y_Val(a4),d1
	bgt.s	Out_Bob
	cmp.w	Bob_Out_Y_Val(a4),d0
	bgt.s	Out_Bob

	rts

Out_Bob:
	move.b	#BOB_FALSE,Bob_Used(a4)
	move.l	Bob_Entry_Adress(a4),a1
	sf	(a1)
	rts

Out_Bob_Damage:
	move.b	#BOB_FALSE,Bob_Used(a4)
	rts

Get_Next_Bob_Frame:
		;Test if End of Table is reached
		move.l	Bob_Next_Anim(a4),a1
		tst.b	Bob_A_Table_End(a1)
		bpl.s	.ok
		cmp	#END_OUT_DAMAGE,Bob_A_Table_End(a1)
		beq	Out_Bob_Damage
		cmp	#END_OUT,Bob_A_Table_End(a1)
		beq	Out_Bob
		cmp	#ENTRY_END,Bob_A_Table_End(a1)
		bne.s	.ok
		move.l	Bob_A_Table_Cont(a1),Bob_Next_Anim(a4)
		bra.s	Get_Next_Bob_Frame
.ok		;Enter new Values
		move.w	Bob_A_Table_Flip(a1),Bob_FlipStatus(a4)
		move.l	Bob_A_Table_Sigel(a1),Bob_SigelInfo(a4)
		move	Bob_A_Table_X_Off(a1),Bob_X_Offset(a4)
		move	Bob_A_Table_Y_Off(a1),Bob_Y_Offset(a4)
		add.l	#BOB_A_ENTRY_SIZE,Bob_Next_Anim(a4)
		rts

Get_Next_Frame_OOff:
		;Test if End of Table is reached
		move.l	Bob_Next_Anim(a4),a1
		cmp	#ENTRY_END,Bob_A_Table_End(a1)
		bne.s	.ok
		move.l	Bob_A_Table_Cont(a1),Bob_Next_Anim(a4)
		bra.s	Get_Next_Bob_Frame
.ok		;Enter new Values
		move.w	Bob_A_Table_Flip(a1),Bob_FlipStatus(a4)
		move.l	Bob_A_Table_Sigel(a1),Bob_SigelInfo(a4)
		add.l	#BOB_A_ENTRY_SIZE,Bob_Next_Anim(a4)
		rts

Standart_BobAnim:
	subq	#1,Bob_Anim_Delay(a4)
	bpl.s	.NoNewAnim
	move	Bob_Anim_Delay_Init(a4),Bob_Anim_Delay(a4)
	jsr	Get_Next_Bob_Frame
.NoNewAnim:
	rts

	IFEQ	1

	;IN:	a0 = CharacterBase
	;	a5 = CharSIGEL
	;	d2 = FlipStatus

Show_Single_Object:
		bsr	Check_Object_Borders
		beq.s	.NoDisplay
		move.w	(a5)+,d3
		lea	(a0,d3.w),a0

		bsr	Alloc_Single_Slot
		beq	.NoDisplay

		move.l	a5,a0
		bsr	Add_Sigel
.NoDisplay
	rts

Show_Double_Object:
		bsr	Check_Object_Borders
		beq.s	.NoDisplay
		move.w	(a5)+,d3
		lea	(a0,d3.w),a0

		bsr	Alloc_Double_Slot
		beq	.NoDisplay

		move.l	a5,a0
		bsr	Add_Sigel
.NoDisplay
	rts

Show_Triple_Object:
		bsr	Check_Object_Borders
		beq.s	.NoDisplay
		move.w	(a5)+,d3
		lea	(a0,d3.w),a0

		bsr	Alloc_Triple_Slot
		beq	.NoDisplay

		move.l	a5,a0
		bsr	Add_Sigel
.NoDisplay
	rts

	ENDC

Show_Simple_Object:
		bsr	Check_Object_Borders
		beq.s	.NoDisplay

		bsr	Add_Sigel
.NoDisplay:
		rts

Show_Big_Simple_Object:
		bsr	Check_Big_Object_Borders
		beq.s	.NoDisplay

		bsr	Add_Sigel
.NoDisplay:
		rts

Show_Simple_Mickey:
		bsr	Check_Big_Object_Borders
		beq.s	.NoDisplay

		bsr	Add_Simple_Sigel
.NoDisplay:
		rts


Check_Big_Object_Borders:
		move.w	Bob_X_Position(a4),d0
		add.w	Bob_X_Offset(a4),d0
		add.w	#128,d0
		sub.w	Scr_X_Level_Pos(a6),d0

		cmp.w	#DISPLAY_X_END,d0
		bgt.s	.NoDisplay
		cmp.w	#1,d0
		blt.s	.NoDisplay

		move.w	Bob_Y_Position(a4),d1
		add.w	Bob_Y_Offset(a4),d1
		add.w	#128,d1
		sub.w	Scr_Y_Level_Pos(a6),d1

		;Clippen der Darstellung

		cmp.w	#DISPLAY_Y_END,d1
		bgt.s	.NoDisplay
		cmp.w	#1,d1
		blt.s	.NoDisplay
		moveq	#1,d7
		rts
.NoDisplay:
		moveq	#0,d7
		rts

DISPLAY_X_START	EQU	128-64
DISPLAY_X_END	EQU	320+128
DISPLAY_Y_START	EQU	128-64
DISPLAY_Y_END	EQU	224+128

Check_Object_Borders:
		move.w	Bob_X_Position(a4),d0
		add.w	Bob_X_Offset(a4),d0
		add.w	#128,d0
		sub.w	Scr_X_Level_Pos(a6),d0

		cmp.w	#DISPLAY_X_END,d0
		bgt.s	.NoDisplay
		cmp.w	#DISPLAY_X_START,d0
		blt.s	.NoDisplay

		move.w	Bob_Y_Position(a4),d1
		add.w	Bob_Y_Offset(a4),d1
		add.w	#128,d1
		sub.w	Scr_Y_Level_Pos(a6),d1

		;Clippen der Darstellung

		cmp.w	#DISPLAY_Y_END,d1
		bgt.s	.NoDisplay
		cmp.w	#DISPLAY_Y_START,d1
		blt.s	.NoDisplay
		moveq	#1,d7
		rts
.NoDisplay:
		moveq	#0,d7
		rts

Check_Object_Borders_Jan:
		;add.w	Bob_X_Offset(a4),d0
		add.w	#128,d0
		sub.w	Scr_X_Level_Pos(a6),d0

		cmp.w	#DISPLAY_X_START,d0
		blt.s	.NoDisplay
		cmp.w	#DISPLAY_X_END,d0
		bgt.s	.NoDisplay

		;add.w	Bob_Y_Offset(a4),d1
		add.w	#128,d1
		sub.w	Scr_Y_Level_Pos(a6),d1

		;Clippen der Darstellung

		cmp.w	#DISPLAY_Y_START,d1
		blt.s	.NoDisplay
		cmp.w	#DISPLAY_Y_END,d1
		bgt.s	.NoDisplay
		moveq	#1,d7
		rts
.NoDisplay:
		moveq	#0,d7
		rts

;------------------------------------------------------------------------------
*******************************************************************************
***********   Slot SYSTEM *****************************************************
*******************************************************************************

	IFEQ	1

Init_Slots:
	move.w	d7,Slot_Count(a6)
	lea	Slot_Table(a6),a0
	move.w	Slot_Count(a6),d7
	subq.w	#1,d7
	moveq	#-1,d0
.init_slots:
	move.l	d0,Slot_RomAdress(a0)
	move.b	d0,Slot_Counter(a0)
	addq.l	#SLOT_LENGTH,a0
	dbf	d7,.init_slots
	rts

;------------ Single Slot -------------------------------------------

	;IN:	a0 = RomAdress
	;
	;OUT:	d3 = Slot-Char-Adress
	;

Alloc_Single_Slot:

	movem.l	d0/a1,-(sp)
	moveq	#0,d0
	lea	Slot_Table(a6),a1
	move.w	Slot_Count(a6),d7
	subq.w	#1,d7
.loop:
	cmp.l	Slot_RomAdress(a1),a0
	beq.s	.use_slot
	cmp.b	Slot_Counter(a1),d0
	bhi.s	.next
	lea	(a1),a3
	move.b	Slot_Counter(a1),d0
.next:
	addq.l	#SLOT_LENGTH,a1
	dbf	d7,.loop

	;Slot in a3
.found:

	tst.b	d0
	beq.s	.no_slot_found

	sf	Slot_Counter(a3)
	move.l	a0,Slot_RomAdress(a3)

	lea	Slot_Table(a6),a1
	sub.l	a1,a3
	add.l	#Slot_Adress_Table,a3
	move.w	2(a3),-(sp)

	lea	0.w,a1
	move.w	(a3),a1

	move.l	d1,-(sp)
	move.w	#32*16,d0			;Size : Fix 16 Chars
	bsr	AddDMA
	move.l	(sp)+,d1
	move.w	(sp)+,d3

.no_slot_found:
.slot_completed:
	movem.l	(sp)+,d0/a1
	rts

.use_slot:
	sf	Slot_Counter(a1)
	lea	(a1),a3
	lea	Slot_Table(a6),a1
	sub.l	a1,a3
	add.l	#Slot_Adress_Table,a3
	move.w	2(a3),d3
	bra	.slot_completed


;------------ Double Slot -------------------------------------------

	;IN:	a0 = RomAdress
	;
	;OUT:	d3 = Slot-Char-Adress
	;

	;Der hintere Slot wird genommen, wenn er nicht allokiert ist!

Alloc_Double_Slot:
	lea	2(a0),a2			;Pseudo-Adresse fr nchsten Slot.
	movem.l	d0/a1,-(sp)
	moveq	#0,d0
	moveq	#0,d6
	lea	Slot_Table(a6),a1
	move.w	Slot_Count(a6),d7
	subq.w	#2,d7
.loop:
	cmp.l	Slot_RomAdress(a1),a0
	beq.s	.use_slot
	cmp.b	Slot_Counter(a1),d0
	bhs.s	.next
	tst.b	Slot_Counter+SLOT_LENGTH(a1)
	beq.s	.next
	lea	(a1),a3
	move.b	Slot_Counter(a1),d0
.next:
	addq.l	#SLOT_LENGTH,a1
	dbf	d7,.loop

	;Slot in a3
.found:

	tst.b	d0
	beq.s	.no_slot_found

	sf	Slot_Counter(a3)
	move.l	a0,Slot_RomAdress(a3)
	sf	Slot_Counter+SLOT_LENGTH(a3)
	move.l	a2,Slot_RomAdress+SLOT_LENGTH(a3)

	add.l	#Slot_Adress_Table-(Slot_Table+WorkRam)+SLOT_LENGTH,a3
	move.w	2(a3),-(sp)

	lea	0.w,a1
	move.w	(a3),a1

	move.l	d1,-(sp)
	move.w	#32*32,d0			;Size : Fix 32 Chars
	bsr	AddDMA
	move.l	(sp)+,d1
	move.w	(sp)+,d3

.no_slot_found:
.slot_completed:
	movem.l	(sp)+,d0/a1
	rts

.use_slot:
	cmp.l	Slot_RomAdress+SLOT_LENGTH(a1),a2
	bne.s	.next
	sf	Slot_Counter(a1)
	sf	Slot_Counter+SLOT_LENGTH(a1)

	add.l	#Slot_Adress_Table-(Slot_Table+WorkRam)+SLOT_LENGTH,a1

	move.w	2(a1),d3
	bra	.slot_completed

;------------ Triple Slot -------------------------------------------

	;IN:	a0 = RomAdress
	;
	;OUT:	d3 = Slot-Char-Adress
	;

	;Der hintere Slot wird genommen, wenn er nicht allokiert ist!

Alloc_Triple_Slot:
	lea	2(a0),a2			;Pseudo-Adresse fr nchsten Slot.
	movem.l	d0/a1,-(sp)
	moveq	#0,d0
	moveq	#0,d6
	lea	Slot_Table(a6),a1
	move.w	Slot_Count(a6),d7
	subq.w	#3,d7
.loop:
	cmp.l	Slot_RomAdress(a1),a0
	beq.s	.use_slot
	cmp.b	Slot_Counter(a1),d0
	bhi.s	.next
	tst.b	Slot_Counter+SLOT_LENGTH(a1)
	beq.s	.next
	tst.b	Slot_Counter+SLOT_LENGTH*2(a1)
	beq.s	.next
	lea	(a1),a3
	move.b	Slot_Counter(a1),d0
.next:
	addq.l	#SLOT_LENGTH,a1
	dbf	d7,.loop

	;Slot in a3
.found:

	tst.b	d0
	beq.s	.no_slot_found

	sf	Slot_Counter(a3)
	move.l	a0,Slot_RomAdress(a3)
	sf	Slot_Counter+SLOT_LENGTH(a3)
	move.l	a2,Slot_RomAdress+SLOT_LENGTH(a3)
	sf	Slot_Counter+SLOT_LENGTH*2(a3)
	move.l	a2,Slot_RomAdress+SLOT_LENGTH*2(a3)

	lea	Slot_Table(a6),a1
	sub.l	a1,a3
	add.l	#Slot_Adress_Table,a3
	move.w	2(a3),-(sp)

	lea	0.w,a1
	move.w	(a3),a1

	move.l	d1,-(sp)
	move.w	#48*32,d0			;Size : Fix 48 Chars
	bsr	AddDMA
	move.l	(sp)+,d1
	move.w	(sp)+,d3

.no_slot_found:
.slot_completed:
	movem.l	(sp)+,d0/a1
	rts

.use_slot:
	cmp.l	Slot_RomAdress+SLOT_LENGTH(a1),a2
	bne.s	.next
	sf	Slot_Counter(a1)
	sf	Slot_Counter+SLOT_LENGTH(a1)
	lea	(a1),a3
	lea	Slot_Table(a6),a1
	sub.l	a1,a3
	add.l	#Slot_Adress_Table,a3
	move.w	2(a3),d3
	bra	.slot_completed

;------ Frame Handler --------------------------------

Handle_Slots:
	lea	Slot_Table(a6),a0
	move.w	Slot_Count(a6),d7
	subq.w	#1,d7
.loop:
	tst.b	Slot_Counter(a0)
	bmi.s	.ok
	addq.b	#1,Slot_Counter(a0)
.ok:
	addq.l	#SLOT_LENGTH,a0
	dbf	d7,.loop
	rts


Slot_Adress_Table:
	dc.w	Slots_VRam+512*24,Slots_VRam/32+16*24,0
	dc.w	Slots_VRam+512*23,Slots_VRam/32+16*23,0
	dc.w	Slots_VRam+512*22,Slots_VRam/32+16*22,0
	dc.w	Slots_VRam+512*21,Slots_VRam/32+16*21,0
	dc.w	Slots_VRam+512*20,Slots_VRam/32+16*20,0
	dc.w	Slots_VRam+512*19,Slots_VRam/32+16*19,0

	dc.w	Slots_VRam+512*18,Slots_VRam/32+16*18,0
	dc.w	Slots_VRam+512*17,Slots_VRam/32+16*17,0
	dc.w	Slots_VRam+512*16,Slots_VRam/32+16*16,0
	dc.w	Slots_VRam+512*15,Slots_VRam/32+16*15,0
	dc.w	Slots_VRam+512*14,Slots_VRam/32+16*14,0
	dc.w	Slots_VRam+512*13,Slots_VRam/32+16*13,0
	dc.w	Slots_VRam+512*12,Slots_VRam/32+16*12,0
	dc.w	Slots_VRam+512*11,Slots_VRam/32+16*11,0
	dc.w	Slots_VRam+512*10,Slots_VRam/32+16*10,0
	dc.w	Slots_VRam+512*9,Slots_VRam/32+16*9,0
	dc.w	Slots_VRam+512*8,Slots_VRam/32+16*8,0
	dc.w	Slots_VRam+512*7,Slots_VRam/32+16*7,0
	dc.w	Slots_VRam+512*6,Slots_VRam/32+16*6,0
	dc.w	Slots_VRam+512*5,Slots_VRam/32+16*5,0
	dc.w	Slots_VRam+512*4,Slots_VRam/32+16*4,0
	dc.w	Slots_VRam+512*3,Slots_VRam/32+16*3,0
	dc.w	Slots_VRam+512*2,Slots_VRam/32+16*2,0
	dc.w	Slots_VRam+512*1,Slots_VRam/32+16*1,0
	dc.w	Slots_VRam,Slots_VRam/32,0

	ENDC

*******************************************************************************
***********   AREA SYSTEM *****************************************************
*******************************************************************************
Init_Extra_Tab:
	lea	RAM_Extras(a6),a1
	move	#EXTRA_ANZ*EXTRA_LENGTH,d0
	asr.w	#2,d0
	bra.s	IAloop

	;IN:	a0 = Pointer to Area-data
	;	d0 = Length of Area-data

Init_Areas:
	lea	Area_Vector(a6),a1
	asr.w	#2,d0
IAloop:
	move.l	(a0)+,(a1)+
	dbf	d0,IAloop
	rts

Area_Check	;Test ob Eintragen ntig ist ?
.TestX	  	;--Test ob X-64er Grenze berschritten wurde
		move	Scr_X_Level_Pos_Old(a6),d0
		move	Scr_X_Level_Pos(a6),d1
		and	#%1111111111000000,d0
		and	#%1111111111000000,d1
		sub.w	d0,d1
		beq.s	.TestY
		;--Enter X according to Scroll-Direction
		bsr	.EnterX
.TestY		;--Test ob Y-64er Grenze berschritten wurde
		move	Scr_Y_Level_Pos_Old(a6),d0
		move	Scr_Y_Level_Pos(a6),d1
		and	#%1111111111000000,d0
		and	#%1111111111000000,d1
		sub.w	d0,d1
		beq.s	.NoMoreTest
		;--Enter Y according to Scroll-Direction
		bsr	.EnterY
.NoMoreTest	rts
*------------------ - - - - - - - - - - - - - - - - - - - - - - - - -
.EnterX		;--Calculate Base for X-Clr
		move.w	d1,d4
		move	Scr_X_Level_Pos(a6),d5
		move	d5,d1
		and	#%1111111111000000,d1
		lsr	#6,d5
		;--Testen ob eins nach links mglich ist
		moveq	#0,d0	;NoSubFlag setzen
		tst	d5
		beq.s	.NoSubd5
		subq	#1,d5
		sub	#64,d1
		moveq	#1,d0	;NoSubFlag lschen
.NoSubd5	tst	d4
		bmi.s	.NoOffsetAddX
		addq	#4+1,d5
		add	#(4+1)*64,d1
		tst	d0		;NoSubFlag testen
		beq.s	.NoOffsetAddX	;Weg,da nicht subtrahiert wurde
		addq	#1,d5
		add	#64,d1
.NoOffsetAddX	move	Scr_Y_Level_Pos(a6),d6
		move	d6,d2
		and	#%1111111111000000,d2
		lsr	#6,d6
		sub	#64,d2
		subq	#1,d6
		bpl.s	.No_under_Zero
		add	#64,d2
		addq	#1,d6
.No_under_Zero	lea	Area_Vector(a6),a0
		add	d5,d5
		mulu	Scr_BA_Anz_Area_X(a6),d6
		add	d6,d6
		add	d5,a0
		add	d6,a0
		;--Enter Loop
		moveq	#4+2-1,d7
.LoopX		jsr	Enter_Bobs_of_Area
		add	Scr_BA_Anz_Area_X(a6),a0
		add	Scr_BA_Anz_Area_X(a6),a0
		add	#64,d2
		dbf	d7,.LoopX
.End_CheckX	rts
*------------------ - - - - - - - - - - - - - - - - - - - - - - - - -
.EnterY		;--Calculate Base for X-Clr
		move.w	d1,d4
		move	Scr_X_Level_Pos(a6),d5
		move	d5,d1
		and	#%1111111111000000,d1
		lsr	#6,d5
		moveq	#5+2-1,d7	;LoopCounter
		;--Testen ob eins nach links mglich ist
		tst	d5
		beq.s	.NoSubd5Y
		subq	#1,d5
		sub	#64,d1
		addq	#1,d7
.NoSubd5Y		move	Scr_Y_Level_Pos(a6),d6
		move	d6,d2
		and	#%1111111111000000,d2
		sub	#64,d2
		lsr	#6,d6
		subq	#1,d6
		bpl.s	.No_under_Zero_Y
		add	#64,d2
		addq	#1,d6
.No_under_Zero_Y
		tst	d4
		bmi.s	.NoOffsetAddY
		addq	#3+1+1,d6
		add	#(3+1+1)*64,d2
.NoOffsetAddY	lea	Area_Vector(a6),a0
		add	d5,d5
		mulu	Scr_BA_Anz_Area_X(a6),d6
		add	d6,d6
		add	d5,a0
		add	d6,a0
		;--Enter Loop
.LoopY		jsr	Enter_Bobs_of_Area
		addq	#2,a0
		add	#64,d1
		dbf	d7,.LoopY
.End_CheckY	rts
*------------------ - - - - - - - - - - - - - - - - - - - - - - - - -
*------------------ - - - - - - - - - - - - - - - - - - - - - - - - -
EnterScreen	;--Calculate Base for X-Clr
		move	Scr_X_Level_Pos(a6),d5
		move	d5,d1
		and	#%1111111111000000,d1
		lsr	#6,d5
		move	Scr_Y_Level_Pos(a6),d6
		move	d6,d2
		and	#%1111111111000000,d2
		lsr	#6,d6
		*--*>nach Oben bzw nach links gehen
		tst	d5
		beq.s	.NoSubX
		subq	#1,d5
		sub	#64,d1
.NoSubX		tst	d6
		beq	.NoSubY
		subq	#1,d6
		sub	#64,d2
.NoSubY		*--*>Calculate Base
		lea	Area_Vector(a6),a0
		add	d5,d5
		mulu	Scr_BA_Anz_Area_X(a6),d6
		add	d6,d6
		add	d5,a0
		add	d6,a0
		;--Enter Loops
		moveq	#4+3-1,d7
.LoopY		movem.l	d1-d2/a0,-(sp)
		moveq	#5+3-1,d6
.LoopX		jsr	Enter_Bobs_of_Area
		addq	#2,a0
		add	#64,d1
		dbf	d6,.LoopX
		movem.l	(sp)+,d1-d2/a0
		add	Scr_BA_Anz_Area_X(a6),a0
		add	Scr_BA_Anz_Area_X(a6),a0
		add	#64,d2
		dbf	d7,.LoopY
		rts
*------------------ - - - - - - - - - - - - - - - - - - - - - - - - -
*------------------ - - - - - - - - - - - - - - - - - - - - - - - - -

*----------------------------------------------------------------------------
*	Enter all Bobs of Area in BobStructure
*	a0	Pointer to OffsetTab
*----------------------------------------------------------------------------
Enter_Bobs_of_Area	movem.l	d0-d1/d6-d7/a0/a6,-(sp)
		;--Test if Bobs/Anims are in Area
		tst	(a0)
		bmi.s	.End_of_Table
		lea	Area_Vector(a6),a1
		add	(a0),a1
.Loop		tst.b	(a1)
		bmi.s	.End_of_Table
		bne.s	.Already_entered

		;Bobs will now be entered
		movem.l	d1-d2/a1,-(sp)
		moveq	#0,d0

		move.b	Area_Bob_Info_Num(a1),d0

		add	Area_X_Position(a1),d1
		add	Area_Y_Position(a1),d2
		jsr	Search_Bob_Entry
		movem.l	(sp)+,d1-d2/a1
		tst	d0
		bmi.s	.Already_entered
		move.b	#1,(a1)
.Already_entered
		addq	#AREA_ENTRY_LENGTH,a1
		bra	.Loop
.End_of_Table	movem.l	(sp)+,d0-d1/d6-d7/a0/a6
		rts

		rsreset
Area_Bob_Entered	rs.b	1
Area_Bob_Info_Num	rs.b	1
Area_X_Position		rs.w	1
Area_Y_Position		rs.w	1
AREA_ENTRY_LENGTH	rs.w	0

;-------------- Interupt Handler ---------------------

WaitVBI:
	tst.b	VBlank_Flag(a6)
	beq.s	WaitVBI
	sf	VBlank_Flag(a6)
	rts

WaitVBIEnd:
	move.w	d0,-(sp)
.wait:
	move.w	$c00004,d0
	btst	#3,d0
	bne	.wait
	move.w	(sp)+,d0
	rts

Init_Interupts:
	lea	WorkRam,a0
	move.w	#$4ef9,Int_HBlank(a0)
	move.l	#Int_Nop,Int_HBlank+2(a0)

	move.w	#$4ef9,Int_VBlank(a0)
	move.l	#Int_Music,Int_VBlank+2(a0)
	move.l	#Copper_Nop,Copper_List(a0)
	rts

Copper_Nop:
	dc.l	.return
	dc.w	$ff
.return:
	rts

int1:	illegal
int2:	illegal
int3:	illegal
int4:	rte
int5:	illegal
int6:	nop
	rte

Standart_VBlank:
	movem.l	d0-d7/a0-a5,-(sp)
	tst.b	Frame_Flag(a6)
	beq.s	.no_frame
	bsr	ScrollDataSet
	bsr	Sigel_TransferList
.no_frame:
	bsr	JoyPadVBI

	tst.b	Frame_Flag(a6)
	beq.s	.no_frame2
	bsr	HandleDMA
	sf	Frame_Flag(a6)
	st	VBlank_Flag(a6)
	not.b	Akt_Copper_Frame(a6)
.no_frame2:

	cmp.b	#$80,$c00008
	blo.s	.dont_wait
	cmp.b	#$f8,$c00008
	blo.s	.no_frame2

	btst	#6,$a10001
	beq.s	.dont_wait

	move.w	#260,d7
.waste_time:
	nop
	dbf	d7,.waste_time

.dont_wait:
	bsr	LoadColors
	bsr	Init_Copper

	movem.l	(sp)+,d0-d7/a0-a5

	bsr	WaitVBIEnd
	move.w	Copper_Next+WorkRam,$c00004
	move.w	#$2300,sr
	jsr	TFMX+12
	rte

Int_Nop:
	nop
	rte

Int_Music:
	jsr	TFMX+12
	rte

Init_Copper:
	move.l	Copper_List(a6),a0
	move.l	(a0)+,a1
	jsr	(a1)
	move.w	(a0)+,d0
	move.l	(a0)+,Int_HBlank+2(a6)
;		move.l	#No_Copper,Int_HBlank+2(a6)
	move.l	a0,Copper_Pointer(a6)
	move.w	d0,d1
	subq.w	#1,d0
	or.w	#$8a00,d0
	move.w	d0,$c00004
	move.w	(a0),d0
	sub.w	d1,d0				;Abstand bis zur nchsten Zeile.
	subq.w	#1,d0
	or.w	#$8a00,d0
	move.w	d0,Copper_Next(a6)
	rts

Get_Next_Copper:
	movem.l	d0-d1/a0,-(sp)
	move.l	Copper_Pointer(a6),a0
	move.w	(a0)+,d1			;In Dieser Zeile wird der Nchste Ausgelst!
	move.l	(a0)+,Int_HBlank+2(a6)
	move.l	a0,Copper_Pointer(a6)
	move.w	(a0),d0
	sub.w	d1,d0
	subq.w	#1,d0
	or.w	#$8a00,d0
	move.w	d0,$c00004
	movem.l	(sp)+,d0-d1/a0
No_Copper:
	rte

;-------------- Size Independent Graphical ELements Handler
;		=    =           =         ==

Sigel_Init:
	move.w	#(640/2)-1,d7
	lea	Sig_VRam_Buffer(a6),a0
	move.l	a0,Sig_VRam_Pointer(a6)
	move.w	#1,Sig_LinkData(a6)
.clear_vram_buffer:
	clr.w	(a0)+
	dbf	d7,.clear_vram_buffer
	rts

	rsreset

Sig_State	rs.l	0
Sig_Size	rs.w	1
Sig_Char	rs.w	1
Sig_XOffset	rs.b	1
Sig_YOffset	rs.b	1

	;IN:
	;d0	= Xpos
	;d1	= Ypos
	;d2	= Flip-Status
	;d3	= Sig_Char_Base

	;a0	= Sigel-Info

Add_Sigel:
	move.l	a4,-(sp)
	move.l	Sig_VRam_Pointer(a6),a5
	lea	Sig_Size_Tab(pc),a4
	moveq	#0,d7
	move.w	(a0)+,d7
	move.w	d7,d4
	and.w	#$f800,d7
	and.w	#$07ff,d4			;d4 = Pixel-Breite des Objekts.
	move.w	d3,Glo_Help(a6)
	btst	#0,d2
	beq.s	.no_xflip_bit
	or.l	#$80000800,d7
.no_xflip_bit:
	btst	#1,d2
	beq.s	.no_yflip_bit
	or.w	#$1000,d7
.no_yflip_bit:

	move.w	Sig_LinkData(a6),d2
.next_partial:
	tst.w	(a0)
	bmi	.obj_complete

	move.b	Sig_YOffset(a0),d5
	ext.w	d5
	add.w	d1,d5

	move.w	d5,(a5)+			;Ypos

	move.w	Sig_Size(a0),d5
	or.w	d2,d5
	move.w	d5,(a5)+
	move.w	Sig_Char(a0),d5
	or.w	d7,d5
	add.w	Glo_Help(a6),d5
	move.w	d5,(a5)+

	btst	#31,d7
	beq.s	.set_xpos_noxflip

	move.b	Sig_XOffset(a0),d5
	ext.w	d5
	neg.w	d5
	add.w	d4,d5

	moveq	#0,d6
	move.b	Sig_Size(a0),d6
	move.b	16(a4,d6.w),d6
	sub.w	d6,d5
	add.w	d0,d5
	move.w	d5,(a5)+			;Xpos

	addq.l	#6,a0
	addq.w	#1,d2

	bra	.next_partial

.set_xpos_noxflip:
	move.b	Sig_XOffset(a0),d5
	ext.w	d5

	add.w	d0,d5
	move.w	d5,(a5)+			;Xpos

	addq.l	#6,a0
	addq.w	#1,d2

	bra	.next_partial

.obj_complete:
	move.w	d2,Sig_LinkData(a6)
	move.l	a5,Sig_VRam_Pointer(a6)

	move.l	(sp)+,a4

	rts

Add_Simple_Sigel:
	move.l	Sig_VRam_Pointer(a6),a5
	move.w	(a0)+,d7
	and.w	#$e000,d7
	move.w	Sig_LinkData(a6),d2
.next_partial:
	move.w	Sig_Size(a0),d6			;8
	bmi.s	.obj_complete			;8 / 10

	move.b	Sig_YOffset(a0),d5		;12
	ext.w	d5				;4
	add.w	d1,d5				;4

	move.w	d5,(a5)+			;8 Ypos

	or.w	d2,d6				;4
	move.w	d6,(a5)+			;8
	move.w	Sig_Char(a0),d5			;12
	or.w	d7,d5				;4
	add.w	d3,d5				;4
	move.w	d5,(a5)+			;8

	move.b	Sig_XOffset(a0),d5		;12
	ext.w	d5				;4

	add.w	d0,d5				;4
	move.w	d5,(a5)+			;8 Xpos

	addq.l	#6,a0				;8
	addq.w	#1,d2				;4
	bra.s	.next_partial			;10
						;---
						;134
.obj_complete:
	move.w	d2,Sig_LinkData(a6)
	move.l	a5,Sig_VRam_Pointer(a6)

	rts

Sig_Size_Tab:
	dc.b	8,16,24,32
	dc.b	8,16,24,32
	dc.b	8,16,24,32
	dc.b	8,16,24,32

	dc.b	8,8,8,8
	dc.b	16,16,16,16
	dc.b	24,24,24,24
	dc.b	32,32,32,32

Sigel_TransferList:
	lea	Sig_VRam_Buffer(a6),a0
	move.l	Sig_VRam_Pointer(a6),a1
	clr.l	(a1)
	move.l	a0,Sig_VRam_Pointer(a6)
	move.w	#1,Sig_LinkData(a6)

	lea	Sig_VRam_Buffer(a6),a0
	move.w	#640,d0
	lea	$f400,a1
	bsr	AddDMA

	rts


;--------------	IO Routines --------------------------

Joy1DIR	equ	$a10009
Joy1	equ	$a10003

PAD_B		EQU	4
PAD_C		EQU	5
PAD_A		EQU	6
PAD_START	EQU	7
PAD_LEFT	EQU	2
PAD_RIGHT	EQU	3
PAD_UP		EQU	0
PAD_DOWN	EQU	1


JoyPadVBI:
	move.b	#$40,Joy1DIR
	move.b	#$00,Joy1
	moveq	#10,d1
.wait:
	dbf	d1,.wait
	move.b	Joy1,d0
	asl.b	#2,d0
	and.b	#$c0,d0
	move.b	#$40,Joy1
	moveq	#10,d1
.wait2:
	dbf	d1,.wait2
	move.b	Joy1,d1
	and.b	#$3f,d1
	or.b	d1,d0
	not.b	d0

	move.b	d0,Glo_JoyPad(a6)

	rts

JoyPad:
	move.b	Glo_JoyPad(a6),d0
	rts

; ==========================================================================
;
; Handled einen Knopf des Joypads, gibt zurck,
; ob der Button losgelassen wurde.
;
; d7 = Bit-Nummer des Buttons, 		Z-Flag:	0 = Button ist noch nicht
; z.B. PAD_START				    oder immer noch gedrckt
;
;						1 = Button wurde released.
;
; ==========================================================================

Ask_Button_Released:
	bsr	JoyPad
	btst	d7,d0
	beq.s	.clear
	bset	d7,button_pressed_flags(a6)
	moveq	#0,d7
	rts
.clear:
	bclr	d7,button_pressed_flags(a6)
	rts

;-------------- VRam, CRam, VSRam Handler ------------
Load_World:
	and.l	#$ffff,d0
	movem.l	d0/a0,-(sp)
	lea	Scratch_Buffer(a6),a5
	bsr	Decrunch
	movem.l	(sp)+,d0/a0
	lea	Scratch_Buffer(a6),a1
	lea	Scr_Macros(a6),a2
	move.w	d0,d1
	moveq	#13-1,d6
.loop2:
	moveq	#20-1,d7
.loop:
	move.w	(a1),(a2)+
	move.w	2(a1),(a2)+
	move.w	80(a1),(a2)+
	move.w	82(a1),(a2)+
	addq.l	#4,a1
	subq.w	#1,d1
	beq.s	.end
	dbf	d7,.loop

	add.l	#160-80,a1
	dbf	d6,.loop2
.end:
	lea	Scratch_Buffer(a6),a1
	asl.l	#3,d0
	add.l	d0,a1
	neg.l	d0
	add.l	4(a0),d0
	move.l	a1,a0
	lea	0.w,a1
	bsr	LoadVRam
	rts

;-------------- VRam, CRam, VSRam Handler ------------
Execute_LoadList:
	tst.w	(a0)
	bmi.s	.end
	moveq	#0,d0
	move.w	(a0)+,d0
	move.w	(a0)+,a1
	move.l	(a0)+,d1
	move.l	a0,-(sp)
	move.l	d1,a0
	bsr	LoadVRam_crunched
	move.l	(sp)+,a0
	bra.s	Execute_LoadList
.end:
	rts

LoadVRam_crunched:
	cmp.l	#"TPWM",(a0)
	bne	LoadVRam
	movem.l	a0-a1,-(sp)
	lea	Scratch_Buffer(a6),a5
	bsr	Decrunch
	movem.l	(sp)+,a0-a1
	move.l	4(a0),d0
	lea	Scratch_Buffer(a6),a0
	bra	LoadVRam

	; Input : a0 = Source-Adress
	;	d0 = Source-Len
	;	a1 = Dest-Adress

LoadVRam:

	movem.l	a2/a3,-(sp)
	lea	DMA_Helper(a6),a2

	move.w	Glo_Display(a6),d2
	or.w	#$0010,d2
	move.w	d2,(a2)+		;0
	move.w	#$8f02,(a2)+		;1

	move.l	a0,d1
	lsr.l	#1,d1
	move.l	d1,Glo_Help(a6)

	lsr.w	#1,d0
	move.w	d0,d1
	and.w	#$ff,d0
	or.w	#$9300,d0
	swap	d0
	lsr.w	#8,d1
	or.w	#$9400,d1
	move.w	d1,d0
	move.l	d0,(a2)+		;2+3	DMA Length

	move.w	#$9500,d1
	move.b	Glo_Help+3(a6),d1
	move.w	d1,(a2)+		;4 Source Adress
	move.w	#$9600,d1
	move.b	Glo_Help+2(a6),d1
	move.w	d1,(a2)+		;5 Source Adress
	move.w	#$9700,d1
	move.b	Glo_Help+1(a6),d1
	and.b	#$7f,d1
	move	d1,(a2)+		;6 Source Adress

	move.w	a1,d1
	and.w	#$3fff,d1
	or.w	#$4000,d1
	move.w	d1,(a2)+		;7
	move.w	a1,d1
	rol.w	#2,d1
	and.w	#$0003,d1
	or.w	#$0080,d1
	move.w	d1,(a2)+		;8

	move.w	Glo_Display(a6),(a2)+	;9

	lea	$c00004,a3
	lea	DMA_Helper(a6),a2
	move.w	(a2)+,(a3)
	move.w	(a2)+,(a3)
	move.w	(a2)+,(a3)
	move.w	(a2)+,(a3)
	move.w	(a2)+,(a3)
	move.w	(a2)+,(a3)
	move.w	(a2)+,(a3)

	move.w	(a2)+,(a3)
	move.w	(a2)+,(a3)

	; DMA is running

	move.w	(a2)+,(a3)

	movem.l	(sp)+,a2/a3

	rts

InitDMA:
	lea	DMA_Buffer(a6),a0

	moveq	#32-1,d7
.init_loop:
	move.w	#$8f00,DMA_Inc(a0)
	move.l	#$93009400,DMA_Len(a0)
	move.l	#$95009600,DMA_Src_Adress(a0)
	move.w	#$9700,DMA_Src_Adress+4(a0)
	lea	DMA_ENTRY_LENGTH(a0),a0
	dbf	d7,.init_loop

	lea	DMA_Buffer(a6),a0
	move.l	a0,DMA_Pointer(a6)
	move.w	#-1,DMA_Dest_Adress(a0)

	rts

			rsreset
DMA_Inc			rs.w	1
DMA_Len			rs.w	2
DMA_Src_Adress		rs.w	3
DMA_Dest_Adress		rs.w	2
DMA_ENTRY_LENGTH	rs.w	0

	; Input : a0 = Source-Adress
	;	  d0 = Source-Len
	;	  a1 = Dest-Adress

AddDMA:
	move.l	DMA_Pointer(a6),a2
	move.b	#$02,DMA_Inc+1(a2)
	lsr	#1,d0
	move.b	d0,DMA_Len+1(a2)
	lsr	#8,d0
	move.b	d0,DMA_Len+3(a2)

	move.l	a0,d0
	lsr.l	#1,d0
	move.l	d0,DMA_Help(a6)

	move.b	DMA_Help+3(a6),DMA_Src_Adress+1(a2)
	move.b	DMA_Help+2(a6),DMA_Src_Adress+3(a2)
	move.b	DMA_Help+1(a6),DMA_Src_Adress+5(a2)

	move	a1,d0
	rol	#2,d0
	and	#$0003,d0
	or	#$0080,d0
	move	d0,DMA_Dest_Adress+2(a2)

	move	a1,d0
	and	#$3fff,d0
	or	#$4000,d0
	move	d0,DMA_Dest_Adress(a2)

	add.l	#DMA_ENTRY_LENGTH,DMA_Pointer(a6)
	move.w	#-1,DMA_ENTRY_LENGTH+DMA_Dest_Adress(a2)
	rts


HandleDMA:
	lea	$c00004,a1
	lea	DMA_Buffer(a6),a0
	move.w	#$8174,d0
	move.w	#$8164,d1
.loop:
	tst.w	DMA_Dest_Adress(a0)
	bmi.s	.out
	move.w	d0,(a1)		;Sequence = Word
	move.l	(a0)+,(a1)
	move.l	(a0)+,(a1)
	move.l	(a0)+,(a1)

	move.w	(a0)+,(a1)
	move.w	(a0)+,(a1)

	move.w	d1,(a1)
	bra.s	.loop
.out:
	lea	DMA_Buffer(a6),a0
	move.l	a0,DMA_Pointer(a6)
	move.w	#-1,DMA_Dest_Adress(a0)
	rts

	; Input :	a0 = Coltab
	;	d0 = Pallette-Nr.
LoadColtab:
	move.w	#$2700,sr
	move	#$8f02,$c00004	; Sequence = Word
	moveq	#0,d1
	and	#3,d0
	asl	#5,d0
	move	d0,d1
	or	#$c000,d1
	swap	d1
	move.l	d1,$c00004
	moveq	#15,d0
.copy:
	move	(a0)+,$c00000
	dbf	d0,.copy
	move.w	#$2400,sr
	rts

SetVRamAdress:
	move	d0,d1
	and	#$3fff,d1
	or	#$4000,d1
	move	d1,$c00004
	move	d0,d1
	rol	#2,d1
	and	#$0003,d1
	move	d1,$c00004
	rts

FadeControler:
	lea	Fade_Struktur(a6),a0
	jmp	Call_Transformation2

LoadColors:
;	lea	$c00004,a0
;	move.l	#$c0000080,Glo_Help(a6)
;	move.l	#$81748f02,(a0)
;	move.l	#$93409400,(a0)
;	move.l	#$95009600+($10000*(Fade_Struktur+Fade_Palette+WorkRam)>>1)&$ff0000+((Fade_Struktur+Fade_Palette+WorkRam)>>9)&$ff,(a0)
;	move.w	#$9700+((Fade_Struktur+Fade_Palette+WorkRam)>>17)&$ff,(a0)
;	move.w	Glo_Help(a6),(a0)
;	move.w	Glo_Help+2(a6),(a0)
;	move.w	#$8164,(a0)


	move.w	#$8f02,$c00004
	lea	$c00000,a0
	lea	Fade_Struktur+Fade_Palette(a6),a1
	move.l	#$c0000000,4(a0)

	movem.l	(a1)+,d0-d7
	move.l	d0,(a0)
	move.l	d1,(a0)
	move.l	d2,(a0)
	move.l	d3,(a0)
	move.l	d4,(a0)
	move.l	d5,(a0)
	move.l	d6,(a0)
	move.l	d7,(a0)

	movem.l	(a1)+,d0-d7
	move.l	d0,(a0)
	move.l	d1,(a0)
	move.l	d2,(a0)
	move.l	d3,(a0)
	move.l	d4,(a0)
	move.l	d5,(a0)
	move.l	d6,(a0)
	move.l	d7,(a0)

	movem.l	(a1)+,d0-d7
	move.l	d0,(a0)
	move.l	d1,(a0)
	move.l	d2,(a0)
	move.l	d3,(a0)
	move.l	d4,(a0)
	move.l	d5,(a0)
	move.l	d6,(a0)
	move.l	d7,(a0)

	movem.l	(a1)+,d0-d7
	move.l	d0,(a0)
	move.l	d1,(a0)
	move.l	d2,(a0)
	move.l	d3,(a0)
	move.l	d4,(a0)
	move.l	d5,(a0)
	move.l	d6,(a0)
	move.l	d7,(a0)

	rts

Init_Hardware:
	lea	$c00004,a0

	move.l	#$80148124,(a0)
	move.l	#$82388300,(a0)
	move.l	#$8406857a,(a0)
	move.l	#$86008700,(a0)
	move.l	#$88008900,(a0)
	move.l	#$8aff8b00,(a0)
	move.l	#$8c818d3c,(a0)
	move.l	#$8e008f02,(a0)
	move.l	#$90019100,(a0)
	move.w	#$9200,(a0)
	rts

	IFNE	Debug

;-------------- Test & Debug -------------------------
SetColor:
	move	#$2700,sr
	move.l	#$c0000000,$c00004
	move	d0,$c00000
	move	#$2300,sr
	rts

;-------------- Communication to Slave ---------------

reg0	equ	$140000
reg1	equ	reg0+2
reg2	equ	reg0+4
reg3	equ	reg0+6

initio:	move.b	#$93,reg3
	bset	#4,reg2
	rts

ci:	btst	#0,reg2
	bne.s	ci
	move.b	reg0,d0
	clr.b	reg2
ciwait2:	btst	#0,reg2
	beq.s	ciwait2
	move.b	#16,reg2
	rts
co:	move.b	#$83,reg3
	move.b	d0,reg0
	clr.b	reg2
cowait:	btst	#0,reg2
	bne.s	cowait
	move.b	#$93,reg3
	move.b	#16,reg2
cowait2:	btst	#0,reg2
	beq.s	cowait2
	rts
keyready:	btst	#0,reg2
	rts

	ENDC

**************************************************************************************
*************	GET LEVEL DATA
**************************************************************************************
;Get_Block_Pos:	;move.l	Scr_Level(a6),a0
;
;		lea	Sky_Level1+8,a0
;
;		move	d1,d3
;		lsr	#4,d1
;		mulu	Scr_Level_Width(a6),d1
;		add.w	d1,d1
;		move	d0,d2
;		lsr	#3,d0
;		and	#%1111111111111110,d0
;		adda.w	d0,a0
;		adda.w	d1,a0
;		and	#%0000000000001111,d2
;		and	#%0000000000001111,d3
;		rts

Init_Block_Tables:
	lea	Block_Table(a6),a0
	moveq	#0,d0
	move.w	#$d0-1,d7
.init_loop:
	move.w	d0,(a0)+
	add.w	Scr_Level_Width(a6),d0
	dbf	d7,.init_loop
	rts

Get_Block_Bits:	movem.l	a1,-(sp)
		*--*>Bere
		move	d0,d2			;4
		move	d1,d3			;4
		and	#$000f,d2		;8
		and	#$000f,d3		;8

		lsr	#3,d1
		and.w	#$fffe,d1
		lea	Block_Table(a6),a0
		move.w	(a0,d1.w),d1
		lsr	#4,d0
		add	d1,d0

		move	d0,d1
		lsr	#1,d0
		move.l	Scr_Level_Bits(a6),a1
		add	d0,a1

		move.l	Scr_Level(a6),a0
		add	d1,a0

		moveq	#0,d0
		move.b	(a0),d0
		swap	d0
		move.b	(a1),d0
		and	#1,d1
		beq.s	.Gerade
.UnGerade		*--*>Shift Down
		and	#$000f,d0
		bra.s	.Weiter
.Gerade		*--*>Ausmaskieren
		lsr	#4,d0
.Weiter		swap	d0
		movem.l	(sp)+,a1
		rts

Get_Block_All:	move.l	a1,-(sp)

		move	d0,d2			;4
		move	d1,d3			;4
		and	#$000f,d2		;8
		and	#$000f,d3		;8

		lsr	#3,d1
		and.w	#$fffe,d1
		lea	Block_Table(a6),a0
		move.w	(a0,d1.w),d1
		lsr	#4,d0
		add	d1,d0

		move	d0,d1
		lsr	#1,d0
		move.l	Scr_Level_Bits(a6),a1	
		add	d0,a1

		move.l	Scr_Level(a6),a0
		moveq	#0,d0
		move.b	(a0,d1.w),d0
		swap	d0
		move.b	(a1),d0
		and	#1,d1
		beq.s	.Gerade
.UnGerade		*--*>Shift Down
		and	#$000f,d0
		bra.s	.Weiter
.Gerade		*--*>Ausmaskieren
		lsr	#4,d0
.Weiter		swap	d0
		move.l	(sp)+,a1
		rts

Get_Block_Icon:
		lsr	#3,d1
		and.w	#$fffe,d1
		lea	Block_Table(a6),a0
		move.w	(a0,d1.w),d1
		lsr	#4,d0
		add	d0,d1
		move.l	Scr_Level(a6),a0
		moveq	#0,d0
		move.b	(a0,d1.w),d0
		rts

Get_Block_Flags:
		lsr	#3,d1
		and.w	#$fffe,d1
		lea	Block_Table(a6),a0
		move.w	(a0,d1.w),d1
		lsr	#4,d0
		add	d1,d0

		move	d0,d1
		lsr	#1,d0
		move.l	Scr_Level_Bits(a6),a0
		move.b	(a0,d0.w),d0
		and	#1,d1
		beq.s	.Gerade
.UnGerade		*--*>Shift Down
		and	#$000f,d0
		bra.s	.Weiter
.Gerade		*--*>Ausmaskieren
		lsr	#4,d0
.Weiter		swap	d0
		rts

**************************************************************************************
*************	ZUFFI ROUTS
**************************************************************************************
*-------------------------------------------------------------------------------------
Get_Zuffi_d0	*--*>Get Zuffizahl
		addq	#3,Get_Zuffi_Val(a6)
		move	Get_Zuffi_Val(a6),d0
		rts
Get_Zuffi_d0_Drag	*--*>Get Zuffizahl
		addq	#5,Get_Zuffi_Val(a6)
		move	Get_Zuffi_Val(a6),d0
		rts
Get_Zuffi_d2	*--*>Get Zuffizahl
		addq	#7,Get_Zuffi_Val(a6)
		move	Get_Zuffi_Val(a6),d2
		rts
Get_Zuffi_d7	*--*>Get Zuffizahl
		add	#9,Get_Zuffi_Val(a6)
		move	Get_Zuffi_Val(a6),d7
		rts

**************************************************************************************
*************	KOLLISION ROUTS
**************************************************************************************
*---------------------------------------------------------------------------
*---------	Kollision ENEMY TIMET
*---------------------------------------------------------------------------
Test_TEMET_Hit_St:
		moveq	#37,d0
		bra.s	Test_TEMET_Hit_Global
Test_TEMET_Hit:	*--Init Vals
		moveq	#4,d0
Test_TEMET_Hit_Global:
		lea	(a6),a2
		*--Test_X
		move	TEMET_X_Koll_AnfPos(a2),d1
		sub	Bob_X_Position(a4),d1
		sub	Bob_X_Offset(a4),d1
		bpl.s	.EnemyLeft
.EnemyRight	moveq	#1,d3
		add	TEMET_X_Koll_Width(a2),d1
		bmi	.NoKoll
		bra.s	.Test_Y
.EnemyLeft	moveq	#-1,d3
		sub	Bob_Width(a4),d1
		bpl	.NoKoll
.Test_Y		*--Test_Y
		move	TEMET_Y_Koll_AnfPos(a2),d1
		sub	Bob_Y_Position(a4),d1
		sub	Bob_Y_Offset(a4),d1
		bpl.s	.EnemyUp
.EnemyDown	moveq	#1,d4
		add	TEMET_Y_Koll_Height(a2),d1
		bmi	.NoKoll
		bra.s	.Koll
.EnemyUp	moveq	#-1,d4
		sub	Bob_Height(a4),d1
		bpl	.NoKoll

.Koll		*--Set Hit Flag and prall ab
		cmp	#COLLECTBORDER_END,Bob_Number(a4)
		bhi.s	.NoCollect
	  	cmp	#HITPOINT,Bob_Number(a4)
		beq.s	.AddHitPoint
		*--Make Extras Out
		jmp	Out_Bob_Damage

.AddHitPoint	*--Init Addiere Hitpoint
		move.b	TEMET_MAX_HitPoints(a2),d0
		cmp.b	TEMET_ANZ_HitPoints(a2),d0
		beq.s	.NoHurray
		IFEQ	SOUNDFX
		;moveq	#22,d0
		;move.l	TFMX_Base,a3
		;jsr	92(a3)
		ENDC
.NoHurray	move.b	#25,HitPoint_Fly_Back(a4)
		rts

.NoCollect	*--Test if TEMET verwundbar
.testKoll	*--*>Test HitPoint abziehen
		tst.b	TEMET_PUNCH_FLAG+1(a2)
		bne.s	.NoKoll
		cmp	#1,TEMET_Shield_Flag(a2)
		beq.s	.TestSubHp
		tst	TEMET_Been_HitTimer(a2)
		bne.s	.NoKoll
.TestSubHp	move.w	#$40,d5
		bsr	Sub_HitPoint_Global
.Prall_Ab	*--von Gegner abprallen
		tst.b	Finish(a6)
		bne.s	.NoKoll
		tst	d3
		bmi.s	.KollLeft
.KollRight	sub	#$0240,TEMET_Speed_X(a2)
		bra.s	.TestKollY
.KollLeft	add	#$0240,TEMET_Speed_X(a2)

.TestKollY	tst	d4
		bmi.s	.KollUp
.KollDown	sub	#$0180,TEMET_Speed_Y(a2)
		rts

.KollUp		add	#$0180,TEMET_Speed_Y(a2)
.NoKoll		rts

**************************************************************************************
*---------------------------------------------------------------------------
*---------	Kollision Top
*---------------------------------------------------------------------------
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
KollTopBobTestMover	*--*>Mover Einsprung in KollTopBopTestRoutine
		moveq	#-2,d7
		cmp	#FLIEGEN,TEMET_Status(a2)
		bne.s	KollTopBob2
		*--Make Fly Koords
		tst	TEMET_New_Calc_Flag(a2)
		beq.s	.OkGoToTest
		rts
.OkGoToTest	move	TEMET_X_Position(a2),d0
		move	TEMET_Y_Position(a2),d1
		add	#16,d0
		add	#45,d1
		bra.s	MoverEinspr
KollTopBobTest	*--*>Test Vals then Test Koll
		moveq	#-1,d7
		cmp	#FLIEGEN,TEMET_Status(a2)
		beq	KollTop_Fly
		cmp	#3,TEMET_Shield_Flag(a2)
		beq	KollTop_FLASH
		tst	TEMET_Dir_Y(a2)
		bmi.s	.Back
		tst	TEMET_New_Calc_Flag(a2)
		beq.s	KollTopBob
.Back		rts
KollTopBob	;Flag auf "keine Kolli" /Koordinaten berechnen
		moveq	#-1,d7
KollTopBob2	move	TEMET_X_PLUS_OFFS(a2),d0
		move	TEMET_Y_PLUS_OFFS(a2),d1
MoverEinspr	sub	Bob_X_Offset(a4),d0
		sub	Bob_Y_Offset(a4),d1
		sub	Bob_X_Position(a4),d0
		sub	Bob_Y_Position(a4),d1

		;TEMET noch ber Anim ?
		tst	d1
		bmi	.Back

		*--*>Einsprung von Mover ?
		cmp	#-2,d7
		beq.s	.MoverTest

		;TEMET schon zu Tief ?
		tst.b	TEMET_PUNCH_FLAG(a2)
		beq.s	.NormalTest
		*--*>PunchTest
		cmp	Bob_Height(a4),d1
		bhi.s	.Back
		bra.s	.AfterNormal
.NormalTest	cmp	#12,d1
		bhi.s	.Back

.AfterNormal	;TEMET links von Anim
		add	#LEFT_TOLERANZ,d0
		tst	d0
		bmi.s	.Back
		;TEMET zu weit rechts ?
		sub	#RIGHT_TOLERANZ,d0
		tst	d0
		bpl.s	.ok
		moveq	#0,d0
.ok		cmp	Bob_Width(a4),d0
		bhi.s	.Back

.MoverIn2		;Kollision Flag On
		tst.b	TEMET_PUNCH_FLAG(a2)
		beq.s	.NoSeTFlag
		move.b	#1,TEMET_PUNCH_FLAG+1(a2)
.NoSeTFlag	moveq	#1,d7
		;TEMET Y Pos Korrigieren
		sub	d1,TEMET_Y_Position(a2)
		move	d1,d5
		*--*>Testen ob timet in y koll drinist
		move	TEMET_X_Position(a2),d0
		add       #16,d0
		move	TEMET_Y_Position(a2),d1
		jsr	Get_Block_Bits
		swap	d0
		btst	#SCR_KOLLISION_BIT,d0
		beq	.Back
	
		;add	d5,TEMET_Y_Position(a2)
		and	#$fff0,TEMET_Y_Position(a2)
		add	#16,TEMET_Y_Position(a2)
		
.Back		rts

*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
.MoverTest	*--*>Mover Toleranz !
		moveq	#-1,d7
		cmp	#12,d1
		bhi.s	.Back

		;TEMET links von Anim
		add	#LEFT_TOLERANZ_M,d0
		tst	d0
		bmi.s	.Back
		;TEMET zu weit rechts ?
		sub	#RIGHT_TOLERANZ_M,d0
		tst	d0
		bpl.s	.ok2
		moveq	#0,d0
.ok2		cmp	Bob_Width(a4),d0
		bhi.s	.Back
		bra.s	.MoverIn2
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
KollTop_Fly	*--Flag auf "keine Kolli" /Koordinaten berechnen
		moveq	#-1,d7
		move	TEMET_X_PLUS_OFFS(a2),d0
		move	TEMET_Y_PLUS_OFFS(a2),d1
		sub	Bob_X_Position(a4),d0
		sub	Bob_Y_Position(a4),d1

		*--TEMET noch ber Anim ?
		tst	d1
		bmi	.Back
		*--TEMET schon zu Tief ?
		cmp	Bob_Height(a4),d1
		bhi.s	.Back

		*--TEMET links von Anim
		tst	d0
		bmi.s	.Back
		;TEMET zu weit rechts ?
		cmp	Bob_Width(a4),d0
		bhi.s	.Back

		;Kollision Flag On
		moveq	#1,d7
.Back		rts

*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
KollTopBobX	;Kollision Flag auf"OFF"
		moveq	#-1,d7
		move	TEMET_X_PLUS_OFFS(a2),d0
		move	TEMET_Y_PLUS_OFFS(a2),d1
		sub	Bob_X_Position(a4),d0
		sub	Bob_X_Offset(a4),d0
		sub	Bob_Y_Position(a4),d1
		sub	Bob_Y_Offset(a4),d1

		;TEMET links von Anim
		add	#LEFT_TOLERANZ_M,d0
		tst	d0
		bmi.s	.Back
		;TEMET zu weit rechts ?
		sub	#RIGHT_TOLERANZ_M,d0
		tst	d0
		bpl.s	.ok
		moveq	#0,d0
.ok		cmp	Bob_Width(a4),d0
		bhi.s	.Back

		;Kollision Flag On
		moveq	#1,d7
.Back		rts
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
KollTop_FLASH	;Kollision Flag auf"OFF"
		moveq	#-1,d7

		lea	WorkRam,a2
		*--Test_X
        		move	TEMET_X_Position(a2),d0
		sub	Bob_X_Position(a4),d0
		sub	Bob_X_Offset(a4),d0
		tst	d0
		bpl.s	.EnemyLeft
.EnemyRight	add	#32,d0
		tst	d0
		bmi	.NoKoll
		bra.s	.Test_Y
.EnemyLeft	sub	Bob_Width(a4),d0
		tst	d0
		bpl	.NoKoll
.Test_Y		*--Test_Y
		move	TEMET_Y_Koll_AnfPos(a2),d0
		sub	Bob_Y_Position(a4),d0
		sub	Bob_Y_Offset(a4),d0
		tst	d0
		bpl.s	.EnemyUp
.EnemyDown	add	TEMET_Y_Koll_Height(a2),d0
		tst	d0
		bmi	.NoKoll
		bra.s	.Koll
.EnemyUp		sub	Bob_Height(a4),d0
		tst	d0
		bpl	.NoKoll
		
.Koll		;Kollision Flag On
		moveq	#1,d7
.NoKoll
.Back		rts

*--------------------------------------------------------
Make_Bump	lea	WorkRam,a2
		cmp	#SEILBAHN,TEMET_Status(a2)
		beq.s	.NoBump

		cmp	#FLIEGEN,TEMET_Status(a2)
		beq.s	.NoBump
		tst.b	TEMET_PUNCH_FLAG(a2)
		bne.s	.NoBump
		move	#SPRINGEN,TEMET_Status(a2)
	 	clr.w	TEMET_JumpHight(a2)
		;Make     TEMET_Speed
		moveq	#0,d0
		clr.w	TEMET_Speed_Y(a2)
		tst	GlobalJoyFire(a6)
		bne.s	.Jump
		tst	TEMET_Underwater(a2)
		beq.s	.OberWaterN
.UnderWaterN	move.b	#-2,TEMET_Speed_Y(a2)
		rts
.OberWaterN	move.b	#-4,TEMET_Speed_Y(a2)
		rts
.Jump		tst	TEMET_Underwater(a2)
		beq.s	.OberWaterJ
.UnderWaterJ	move.b	#-5,TEMET_Speed_Y(a2)
		rts
.OberWaterJ	move.b	#-8,TEMET_Speed_Y(a2)
.NoBump		rts

*------------------------------------------------------------------------------
Sub_TEMET_Hitpoint:
		moveq	#4,d0
		bra	Sub_HitPoint_Global

Sub_TEMET_Hitpoint_St:
		moveq	#37,d0
		bra	Sub_HitPoint_Global

Sub_HitPoint_Global:
		*--*>Temet hitpoint sub
		*--test if Shield was on
		tst.b	Finish(a6)
		bne.s	.NoSubHP
		add	d5,d5
		cmp	#2,TEMET_Shield_Flag(a2)
		beq.s	.NoSubHP
		tst	TEMET_Been_HitTimer(a2)
		bmi	.Prall_Ab
		bne	.NoSubHP
		tst.b	TEMET_ANZ_HitPoints(a2)
		beq.s	.Make_Dead
		*--HitPoint abziehen
		IFEQ	SOUNDFX
		jsr	TFMX+16
		ENDC
		subq.b	#1,TEMET_ANZ_HitPoints(a2)
		subq.b	#1,SCR_HitPoint_Soll(a2)

		move	#HITPOINT,d0
		move	Scr_X_Level_Pos(a6),d1
		add	#16,d1
		moveq	#0,d2
		move.b	TEMET_ANZ_HitPoints(a2),d2
		lsl	#3,d2
		add	d2,d1
		subq	#3,d1 
		move	Scr_Y_Level_Pos(a6),d2
		add	#32,d2
		lea	Area_Enter_Vector(a6),a1
		movem.l	a4,-(sp)
		jsr	Search_Bob_Entry
		movem.l	(sp)+,a4
.Prall_Ab		*--Blink_an
		move	d5,TEMET_Been_HitTimer(a2)
		clr.w	TEMET_Shield_Flag(a2)
.NoSubHP	rts
.Make_Dead	*--*>TTEN !!!
		move.b	#1,Dead(a6)
		rts

	ENDC
